package config

import (
	"fmt"
	"github.com/go-redis/redis/v8"
	"github.com/spf13/viper"
	"log"
	"os"
	"test.com/project-common/logs"
)

var AppConf = InitConfig()

type Config struct {
	viper       *viper.Viper
	SC          *ServerConfig // 服务器配置
	GC          *GrpcConfig   // gRPC 服务配置
	EtcdConfig  *EtcdConfig   // etcd 服务配置
	MysqlConfig *MysqlConfig  // mysql 服务配置
	JwtConfig   *JwtConfig    // Jwt 配置
}

type ServerConfig struct {
	Name string // 服务器名称
	Addr string // 服务器地址
}

type GrpcConfig struct {
	Name    string // gRPC 服务名称
	Addr    string // gRPC 服务地址
	Version string // gRPC 服务版本
	Weight  int64  // gRPC 服务权重
}

type EtcdConfig struct {
	Addrs []string // etcd 服务地址集合
}

type MysqlConfig struct {
	Username string
	Password string
	Host     string
	Port     int
	Db       string
}

type JwtConfig struct {
	AccessExp     int
	RefreshExp    int
	AccessSecret  string
	RefreshSecret string
}

func InitConfig() *Config {
	v := viper.New()
	conf := &Config{viper: v}
	workDir, _ := os.Getwd()
	conf.viper.SetConfigName("config")            // 设置配置文件名称
	conf.viper.SetConfigType("yaml")              // 设置配置文件类型
	conf.viper.AddConfigPath("./config")          // 添加配置文件搜索路径
	conf.viper.AddConfigPath(workDir + "/config") // 添加配置文件搜索路径
	err := conf.viper.ReadInConfig()              // 读取配置文件
	if err != nil {
		log.Fatalln(err) // 错误处理
	}
	conf.ReadServerConfig() // 读取服务器配置
	conf.InitZapLog()       // 读取日志配置，初始化日志
	conf.ReadGrpcConfig()   // 读取gRPC服务配置
	conf.ReadEtcdConfig()   // 读取etcd服务配置
	conf.InitMysqlConfig()  // 读取mysql服务配置
	conf.InitJwtConfig()    // 读取jwt配置
	return conf
}

func (c *Config) ReadServerConfig() {
	sc := &ServerConfig{}
	sc.Name = c.viper.GetString("server.name") // 读取服务器名称
	sc.Addr = c.viper.GetString("server.addr") // 读取服务器地址
	c.SC = sc                                  // 设置服务器配置
}

func (c *Config) InitZapLog() {
	// 从配置中读取日志配置，初始化日志
	lc := &logs.LogConfig{
		DebugFileName: c.viper.GetString("zap.debugFileName"), // 读取调试日志文件名
		InfoFileName:  c.viper.GetString("zap.infoFileName"),  // 读取信息日志文件名
		WarnFileName:  c.viper.GetString("zap.warnFileName"),  // 读取警告日志文件名
		MaxSize:       c.viper.GetInt("maxSize"),              // 读取日志文件最大大小
		MaxAge:        c.viper.GetInt("maxAge"),               // 读取日志文件最大保存时间
		MaxBackups:    c.viper.GetInt("maxBackups"),           // 读取日志文件最大备份数量
	}
	err := logs.InitLogger(lc)
	if err != nil {
		log.Fatalln(err) // 错误处理
	}
}

func (c *Config) ReadRedisConfig() *redis.Options {
	return &redis.Options{
		Addr:     c.viper.GetString("redis.host") + ":" + c.viper.GetString("redis.port"), // 读取Redis服务器地址
		Password: c.viper.GetString("redis.password"),                                     // 读取Redis服务器密码
		DB:       c.viper.GetInt("redis.db"),                                              // 读取Redis数据库索引
	}
}

func (c *Config) ReadGrpcConfig() {
	gc := &GrpcConfig{}
	gc.Name = c.viper.GetString("grpc.name")       // 读取gRPC服务名称
	gc.Addr = c.viper.GetString("grpc.addr")       // 读取gRPC服务地址
	gc.Version = c.viper.GetString("grpc.version") // 读取gRPC服务版本
	gc.Weight = c.viper.GetInt64("grpc.weight")    // 读取gRPC服务权重
	c.GC = gc                                      // 设置gRPC服务配置
}

func (c *Config) ReadEtcdConfig() {
	ec := &EtcdConfig{}
	var addrs []string
	err := c.viper.UnmarshalKey("etcd.addrs", &addrs)
	fmt.Println(addrs)
	if err != nil {
		log.Fatalln(err) // 错误处理
	}
	ec.Addrs = addrs
	c.EtcdConfig = ec // 设置etcd服务配置
}

func (c *Config) InitMysqlConfig() {
	mc := &MysqlConfig{
		Username: c.viper.GetString("mysql.username"),
		Password: c.viper.GetString("mysql.password"),
		Host:     c.viper.GetString("mysql.host"),
		Port:     c.viper.GetInt("mysql.port"),
		Db:       c.viper.GetString("mysql.db"),
	}
	c.MysqlConfig = mc
}

func (c *Config) InitJwtConfig() {
	jw := &JwtConfig{
		AccessExp:     c.viper.GetInt("jwt.accessExp"),
		RefreshExp:    c.viper.GetInt("jwt.refreshExp"),
		AccessSecret:  c.viper.GetString("jwt.accessSecret"),
		RefreshSecret: c.viper.GetString("jwt.refreshSecret"),
	}
	c.JwtConfig = jw
}
